using System.Text.Json;
using RadioTimer.Models;

namespace RadioTimer.Services
{
    /// <summary>
    /// 数据存储服务实现类
    /// 实现IDataStorageService接口，使用MAUI Preferences API进行数据持久化
    /// 支持JSON序列化和反序列化，具备错误处理和日志记录功能
    /// </summary>
    public class DataStorageService : IDataStorageService
    {
        #region 常量定义
        
        /// <summary>
        /// 应用程序设置在Preferences中的键名
        /// </summary>
        private const string AppSettingsKey = "AppSettings";
        
        /// <summary>
        /// 统计信息在Preferences中的键名
        /// </summary>
        private const string StatisticsKey = "ChimeStatistics";
        
        #endregion

        #region 公共方法
        
        /// <summary>
        /// 异步加载应用程序设置
        /// 从本地存储中读取JSON格式的设置数据，并反序列化为AppSettings对象
        /// </summary>
        /// <returns>返回应用程序设置对象，如果加载失败或不存在则返回默认设置</returns>
        public Task<AppSettings> LoadAppSettingsAsync()
        {
            try
            {
                // 从本地存储中获取JSON字符串
                var json = Preferences.Get(AppSettingsKey, string.Empty);
                if (string.IsNullOrEmpty(json))
                {
                    // 如果没有存储的设置，返回默认设置
                    return Task.FromResult(new AppSettings());
                }

                // 反序列化JSON为AppSettings对象
                var settings = JsonSerializer.Deserialize<AppSettings>(json);
                return Task.FromResult(settings ?? new AppSettings());
            }
            catch (Exception ex)
            {
                // 记录错误信息并返回默认设置
                Services.DebugLogger.WriteError($"Error loading app settings: {ex.Message}");
                return Task.FromResult(new AppSettings());
            }
        }

        /// <summary>
        /// 异步保存应用程序设置
        /// 将AppSettings对象序列化为JSON格式并存储到本地
        /// </summary>
        /// <param name="settings">要保存的应用程序设置对象</param>
        /// <returns>异步任务</returns>
        public Task SaveAppSettingsAsync(AppSettings settings)
        {
            try
            {
                // 将设置对象序列化为JSON字符串
                var json = JsonSerializer.Serialize(settings);
                // 保存到本地存储
                Preferences.Set(AppSettingsKey, json);
                return Task.CompletedTask;
            }
            catch (Exception ex)
            {
                // 记录错误信息
                Services.DebugLogger.WriteError($"Error saving app settings: {ex.Message}");
                return Task.CompletedTask;
            }
        }

        /// <summary>
        /// 异步加载报时统计信息
        /// 从本地存储中读取JSON格式的统计数据，并反序列化为ChimeStatistics对象
        /// </summary>
        /// <returns>返回报时统计信息对象，如果加载失败或不存在则返回默认统计信息</returns>
        public Task<ChimeStatistics> LoadStatisticsAsync()
        {
            try
            {
                // 从本地存储中获取JSON字符串
                var json = Preferences.Get(StatisticsKey, string.Empty);
                if (string.IsNullOrEmpty(json))
                {
                    // 如果没有存储的统计信息，返回默认统计信息
                    return Task.FromResult(new ChimeStatistics());
                }

                // 反序列化JSON为ChimeStatistics对象
                var statistics = JsonSerializer.Deserialize<ChimeStatistics>(json);
                return Task.FromResult(statistics ?? new ChimeStatistics());
            }
            catch (Exception ex)
            {
                // 记录错误信息并返回默认统计信息
                Services.DebugLogger.WriteError($"Error loading statistics: {ex.Message}");
                return Task.FromResult(new ChimeStatistics());
            }
        }

        /// <summary>
        /// 异步保存报时统计信息
        /// 将ChimeStatistics对象序列化为JSON格式并存储到本地
        /// </summary>
        /// <param name="statistics">要保存的报时统计信息对象</param>
        /// <returns>异步任务</returns>
        public Task SaveStatisticsAsync(ChimeStatistics statistics)
        {
            try
            {
                // 将统计信息对象序列化为JSON字符串
                var json = JsonSerializer.Serialize(statistics);
                // 保存到本地存储
                Preferences.Set(StatisticsKey, json);
                return Task.CompletedTask;
            }
            catch (Exception ex)
            {
                // 记录错误信息
                Services.DebugLogger.WriteError($"Error saving statistics: {ex.Message}");
                return Task.CompletedTask;
            }
        }

        /// <summary>
        /// 异步清除所有存储的数据
        /// 从本地存储中移除所有应用程序设置和统计信息
        /// </summary>
        /// <returns>异步任务</returns>
        public Task ClearAllDataAsync()
        {
            try
            {
                // 移除应用程序设置和统计信息
                Preferences.Remove(AppSettingsKey);
                Preferences.Remove(StatisticsKey);
                return Task.CompletedTask;
            }
            catch (Exception ex)
            {
                // 记录错误信息
                Services.DebugLogger.WriteError($"Error clearing data: {ex.Message}");
                return Task.CompletedTask;
            }
        }
        
        #endregion
    }
}